/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import user_gui.FramePrincipal;

/**
 *
 * @author Jonatas
 */
public class ValorFinal implements Comparable<ValorFinal> {

    private static class ComparatorLigacaoPlano implements Comparator<LigacaoPlano> {

        public int compare(LigacaoPlano o1, LigacaoPlano o2) {
            return o1.getOrigem().compareTo(o2.getOrigem());
        }
    }
    private Telefone origem;
    private int num;
    private double valorTotal;
    private int tempoTotalSegundos;

    public ValorFinal(Telefone origem, int num, double valorTotal, int tempoTotalSegundos) {
        this.origem = origem;
        this.num = num;
        this.valorTotal = valorTotal;
        this.tempoTotalSegundos = tempoTotalSegundos;
    }

    public static List<ValorFinal> getListValoresFinais(List<LigacaoPlano> ligPlano, List<TarifaPlano> tarifas,
            Map<Telefone, DescontoTelefone> descontos) {

        Collections.sort(ligPlano, new ComparatorLigacaoPlano());
        List<ValorFinal> valoresFinais = new ArrayList<ValorFinal>();

        Telefone origemAtual = null;
        int qtdeLig = 0;
        double valor = 0.0;
        int tempoSeg = 0;

        for (LigacaoPlano lig : ligPlano) {

            if (lig.getOrigem() == null) {
                continue;
            }

            if (!lig.getOrigem().equals(origemAtual)) {

                if (origemAtual != null) {
                    ValorFinal valorFinal = new ValorFinal(origemAtual, qtdeLig, valor, tempoSeg);
                    valoresFinais.add(valorFinal);
                }

                origemAtual = lig.getOrigem();
                qtdeLig = lig.getQtdeLigacoes();
                tempoSeg = lig.getTempoTotal();


                if (lig.getValorTotal() <= 0.0) {

                    TarifaPlano tarifa = null;

                    for (TarifaPlano tp : tarifas) {
                        if (tp.getPlano().equals(lig.getPlano())) {
                            tarifa = tp;
                            break;
                        }
                    }

                    valor = FramePrincipal.getValorTotalComTarifas(lig.getTempoTotal(), tarifa.getTarifa());

                } else {
                    valor = lig.getValorTotal();
                }



            } else {
                qtdeLig += lig.getQtdeLigacoes();

                if (lig.getValorTotal() <= 0.0) {

                    TarifaPlano tarifa = null;

                    for (TarifaPlano tp : tarifas) {
                        if (tp.getPlano().equals(lig.getPlano())) {
                            tarifa = tp;
                            break;
                        }
                    }

                    valor += FramePrincipal.getValorTotalComTarifas(lig.getTempoTotal(), tarifa.getTarifa());

                } else {
                    valor += lig.getValorTotal();
                }

                tempoSeg += lig.getTempoTotal();

            }

        }

        ValorFinal valorFinal = new ValorFinal(origemAtual, qtdeLig, valor, tempoSeg);
        valoresFinais.add(valorFinal);

        removeDescontos(valoresFinais, descontos);

        return valoresFinais;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public Telefone getOrigem() {
        return origem;
    }

    public void setOrigem(Telefone origem) {
        this.origem = origem;
    }

    public int getTempoTotalSegundos() {
        return tempoTotalSegundos;
    }

    public void setTempoTotalSegundos(int tempoTotalSegundos) {
        this.tempoTotalSegundos = tempoTotalSegundos;
    }

    public double getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(double valorTotal) {
        this.valorTotal = valorTotal;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ValorFinal other = (ValorFinal) obj;
        if (this.origem != other.origem && (this.origem == null || !this.origem.equals(other.origem))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + (this.origem != null ? this.origem.hashCode() : 0);
        return hash;
    }

    public String getTempoTotalHoras() {
        return EntradaAbstrata.getDuracaoHoras(tempoTotalSegundos);
    }

    public int compareTo(ValorFinal o) {
        return -(new Double(valorTotal).compareTo(new Double(o.valorTotal)));
    }

    private static void removeDescontos(List<ValorFinal> valores, Map<Telefone, DescontoTelefone> descontos) {

        for (ValorFinal valor : valores) {

            if (descontos.containsKey(valor.getOrigem())) {
                DescontoTelefone desconto = descontos.get(valor.getOrigem());
                valor.valorTotal += desconto.getDescontoTotal();
            }

        }
    }
}
